package com.fowo.api.flow.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fowo.api.common.model.R;
import com.fowo.api.flow.entity.ProcessTemplates;
import com.fowo.api.flow.model.dto.*;
import com.fowo.api.flow.model.vo.*;
import com.fowo.api.sys.entity.SysUser;
import org.flowable.engine.history.HistoricActivityInstance;

import java.util.List;
import java.util.Map;

/**
 * @fileName: DemoFlowService
 * @Description: 代码目的，作用，如何工作
 * @Author: pzh
 * @Date: 2023/3/28 0028 17:48
 */
public interface FlowService {

    /**
     * 通过模板id查看流程信息 会附带流程定义id
     *
     * @param templateId 模板id
     * @return
     * @throws Exception
     */
    ProcessTemplates detail(String templateId) throws Exception;

    /**
     * 通过流程定义id启动流程
     *
     * @param startList 流程启动参数
     * @return
     */
    R<Object> start(List<StartProcessInstanceDTO> startList);

    /**
     * 查看我发起的流程
     *
     * @param applyDTO
     * @return
     */
    Page<HistoryProcessInstanceVO> applyList(ApplyDTO applyDTO);

    /**
     * 查看我的待办
     *
     * @param taskDTO
     * @return
     */
    Page<TaskVO> toDoList(ApplyDTO taskDTO);

    /**
     * 查看我的已办
     *
     * @param taskDTO
     * @return
     */
    Page<TaskVO> doneList(ApplyDTO taskDTO);

    /**
     * 通过流程实例id查看详情
     *
     * @param HandleDataDTO
     * @return
     */
    HandleDataVO instanceInfo(HandleDataDTO HandleDataDTO);

    /**
     * 通过业务id,业务表单查询任务详情
     *
     * @param recordFlowDTO
     * @return
     */
    HandleDataVO recordFlow(RecordFlowDTO recordFlowDTO) throws Exception;

    /**
     * 流程处理
     *
     * @param handleDataDTO
     * @throws Exception
     */
    R handle(HandleDataDTO handleDataDTO) ;

    /**
     * 减签
     *
     * @param executionIds
     */
    void deleteMulti(List<String> executionIds);

    /**
     * 查到签上的人
     *
     * @param map
     */
    List<MultiVO> queryMultiUsersInfo(Map<String, Object> map);


    List<NodeVo> queryNode(String processInstanceId);

    /**
     * 执行js脚本
     *
     * @param callJsDataDTO 数据处理
     * @return
     */
    Object callJsData(CallJsDataDTO callJsDataDTO);

    SysUser queryNodeUser(String wfId);

    void updateRecordStatus(String formName, Long recordId, Integer wfStatus, List<HistoricActivityInstance> list);

    R batchApproval(List<HandleDataListDTO> handleDataListDTOList);

}
